package br.edu.catolica.sadbc.core.util;

import org.apache.commons.lang.StringUtils;

public class StringUtil {
	
	private static StringUtil instance;
	
	private StringUtil(){}
	
	public static StringUtil getInstance(){
		if(instance == null){
			instance = new StringUtil();
		}
		return instance;
	}

	/**
	 * Verifica se a <code>java.lang.String</code> informada esta vazia ou nula.
	 * 
	 * @param str a <code>java.lang.String</code> a ser verificada.
	 * @return
	 */
	public boolean isVazia(final String str) {
		return StringUtils.isEmpty(str.trim());
	}
	
	public boolean isNaoVazia(final String str) {
		return StringUtils.isNotEmpty(str.trim());
	}
	
	public boolean isMenor(final int tam, final String str) {
		return StringUtils.length(str.trim()) < tam;
	}

	/**
	 * @param texto
	 * @return String
	 */
	static public String retiraAcentos(String texto) {
		texto = texto.replaceAll("[ÂÀÁÄÃ]","A");   
		texto = texto.replaceAll("[âãàáä]","a");   
		texto = texto.replaceAll("[ÊÈÉË]","E");   
		texto = texto.replaceAll("[êèéë]","e");   
		texto = texto.replaceAll("ÎÍÌÏ","I");   
		texto = texto.replaceAll("îíìï","i");   
		texto = texto.replaceAll("[ÔÕÒÓÖ]","O");   
		texto = texto.replaceAll("[ôõòóö]","o");   
		texto = texto.replaceAll("[ÛÙÚÜ]","U");   
		texto = texto.replaceAll("[ûúùü]","u");   
		texto = texto.replaceAll("Ç","C");   
		texto = texto.replaceAll("ç","c");    
		texto = texto.replaceAll("[ýÿ]","y");   
		texto = texto.replaceAll("Ý","Y");   
		texto = texto.replaceAll("ñ","n");   
		texto = texto.replaceAll("Ñ","N");
		return texto;
	}
	
	
	/**
	 * Altera a <code>java.lang.String</code> passada como param�tro e remove os caract�res '.', '-' e '/'
	 * @param str a <code>java.lang.String</code> a ser alterada
	 * @return String;
	 */
	public String retirarCaracteresEspeciais(String str) {
		str = str.replaceAll("[.]", "");
		str = str.replaceAll("[-]", "");
		str = str.replaceAll("[/]", "");
		return str;
	}
	
	/**
	 * Abrevia uma String usando retic�cias. Ex: "Now is the time for all good men" into "Now is the time for..."
	 * 	Outros Exemplos:
	 *  .abreviar(null, *)      = null
	 *  .abreviar("", 4)        = ""
	 *  .abreviar("abcdefg", 6) = "abc..."
	 *  .abreviar("abcdefg", 7) = "abcdefg"
	 *  .abreviar("abcdefg", 8) = "abcdefg"
	 *  .abreviar("abcdefg", 4) = "a..."
	 *  .abreviar("abcdefg", 3) = IllegalArgumentException

	 * @param str
	 * @param tamanhoMaximo
	 * @return
	 */
	public String abreviar(String str, int tamanhoMaximo){
		return StringUtils.abbreviate(str, tamanhoMaximo);
	}
	
	/**
	 * Remove todos os espa�os em branco de uma String
	 * Ex:
	 * removeEspacosEmBranco(null)         = null
	 * removeEspacosEmBranco("")           = ""
	 * removeEspacosEmBranco("abc")        = "abc"
	 * removeEspacosEmBranco("   ab  c  ") = "abc"
	 * @param str
	 * @return
	 */
	public String removeEspacosEmBranco(String str){
		return StringUtils.deleteWhitespace(str);
	}
	
	/**
	 * Verifica se a String contem somente caract�res letras ou digitos
	 * @param str
	 * @return
	 */
	public boolean isAlfanumerico(String str){
		return StringUtils.isAlphanumeric(str);
	}
	
	/**
	 * Verifica se a String contem somente letras 
	 * @param str
	 * @return
	 */
	public boolean isAlfa(String str){
		return StringUtils.isAlpha(str);
	}
	
	/**
	 * Verifica se a String contem somente digitos
	 * @param str
	 * @return
	 */
	public boolean isNumeric(String str){
		return StringUtils.isNumeric(str);
	}
	
	/**
	 * Concatena uma String � esquerda com um caractere espec�fico
	 * Ex:
	 * .concantenaEsquerda(null, *, *)     = null
	 * .concantenaEsquerda("", 3, 'z')     = "zzz"
	 * .concantenaEsquerda("bat", 3, 'z')  = "bat"
	 * .concantenaEsquerda("bat", 5, 'z')  = "zzbat"
	 * .concantenaEsquerda("bat", 1, 'z')  = "bat"
	 * .concantenaEsquerda("bat", -1, 'z') = "bat"
	 * @param str
	 * @param tamanho
	 * @param caractere
	 * @return
	 */
	public String concantenaEsquerda(String str, int tamanho, char caractere){
		return StringUtils.leftPad(str, tamanho, caractere);
	}
	
	/**
	 * Concatena uma String � direita com uma caractere especifico
	 * Ex:
	 * .concatenaDireita(null, *, *)     = null
	 * .concatenaDireita("", 3, 'z')     = "zzz"
	 * .concatenaDireita("bat", 3, 'z')  = "bat"
	 * .concatenaDireita("bat", 5, 'z')  = "batzz"
	 * .concatenaDireita("bat", 1, 'z')  = "bat"
	 * .concatenaDireita("bat", -1, 'z') = "bat"
	 * @param str
	 * @param tamanho
	 * @param caractere
	 * @return
	 */
	public String concatenaDireita(String str, int tamanho, char caractere){
		return StringUtils.rightPad(str, tamanho, caractere);
	}
	
	/*
     * realiza a formatacao do valor de acordo com a mascara enviada
     */
    public static String formatar( String valor, String mascara ) {
    
        String dado = "";      
        // remove caracteres nao numericos
        for ( int i = 0; i < valor.length(); i++ )  {
            char c = valor.charAt(i);
            if ( Character.isDigit( c ) ) { dado += c; }
        }

        int indMascara = mascara.length();
        int indCampo = dado.length();

        for ( ; indCampo > 0 && indMascara > 0; ) {
            if ( mascara.charAt( --indMascara ) == '#' ) { indCampo--; }
        }

        String saida = "";
        for ( ; indMascara < mascara.length(); indMascara++ ) {    
            saida += ( ( mascara.charAt( indMascara ) == '#' ) ? dado.charAt( indCampo++ ) : mascara.charAt( indMascara ) );
        }    
        return saida;
    }

	@SuppressWarnings("static-access")
	public String formatarCNPJ(String string) {
		return this.formatar(string, "##.###.###/####-##");
	}

	@SuppressWarnings("static-access")
	public String formatarCPF(String string) {
		return this.formatar(string, "###.###.###-##");
	}
	
	@SuppressWarnings("static-access")
	public String formatarValor(String valor, String mascara ){
	    if(valor.length() == 1){
	        valor = this.concantenaEsquerda(valor, 3, '0');
	    }
	    if(valor.length() == 2){
	        valor = this.concantenaEsquerda(valor, 3, '0');
        }
	    return this.formatar(valor, mascara);
	}
	
	static public String formatarCep(String texto) {
		return formatar(texto, "##.###-###");
	}
	
}
